o soluţie ineficientă ca timp de execuţie, dar utilă pentru a învăţa să lucrăm pe stringuri ar fi să căutăm al 2 lea şir în primul şi să "tăiem" din spatele şirului o literă până găsim un subşir....... sau să luăm prima literă a primului cuvânt să-l adăugăm la sfârşit ......
#include <cstring>
#include<fstream>
problema campion
using namespace std;
ifstream f("circular.in");
ofstream g("circular.out");
char si[20001],sf[20001],*p;
int n;
int main()
{ char sc[20001],st[20001];
f>>n;
f.get();
f.getline(si,20000);
f.getline(sf,20000);
strcpy(sc,sf);
int c=n-1;
int ok=1; prima litera tb sa existe in textul initial if(strchr(si,sf[0])==0) g<<-1; else { while(ok) { p=strstr(si,sc); if(p){ok=0;} else { strcpy(sc+c,sc+c+1);
sterg ultima litera
--c;
}
}
++c; valoare corecta c int poz=p-si;pozitia celui mai lung subsir impart sirul strcpy(st,sf+c); strcpy(si+poz,si+poz+c);
sterg din sirul initial subsirul gasit
if (strcmp(si,st)==0) g<<poz;
else g<<-1;
}
return 0;
}
o soluţie simplă, eficientă ca timp de execuţie... să concatenăm primul şir cu el însuşi şi să căutăm al doilea şir în şirul concatenat
using namespace std;
ifstream f("circular.in");
ofstream g("circular.out");
char si[40001],sf[20001],*p;
int n;
int main()
{ char sc[20001],st[20001];
f>>n;
f.get();
f.getline(si,20000);
f.getline(sf,20000);
strcat(si,si);
p=strstr(si,sf);
if(p) g<<p-si;
else g<<-1;
STRTOK Sintaxa: strtok(s1_unde_caut, s2_ce_separatori_caut) Functia inlocuieste separatorii din s1 cu NULL si returneaza un pointer catre primul character al primei unităţi lexicale(Ex.cuvant)..pentru a gasi urmatoarea secventa se apeleaza strtok(NULL, s2)
P3. Separarea cuvintelor din text cu strtok()
#include <cstring>
#include <iostream>
using namespace std;
int main()
{ char s[100]="Popescu Vasile",*c1,*c2;
c1=strtok(s," ");
cout<<c1<<endl;
c2=strtok(NULL," ");
cout<<c2<<endl;
strcat(c2," ");
strcat(c2,c1);
cout<<c2;
return 0;
}
Ex1. Sa se afiseze cuvintele dintr-un text
#include <iostream>
#include <cstring> exemple ptr.utilizarea
fctiei strtok
using namespace std;
char sir[]="anul acesta, va fi un bacalaureat foarte usor si vom lua toti nota 10";
char *p; pointer catre char
declaram separatorii intre cuvinte virgula si spatiu de exemplu
char sep[]=", ";
int main() { p=strtok(sir,sep);
while (p)
{cout<<p<<endl; p=strtok(NULL,sep);
}
return 0;
}
Ex.2 .prelucrare cuvinte din text
Se consideră un text cu maximum 250 de caractere, format din litere mici ale alfabetului englez şi spaţii. Cuvintele sunt separate printr-un singur spaţiu. Scrieţi programul Pascal/C/C++ care citeşte un text ca cel menţionat şi afişează pe ecran acele cuvinte în care vocalele apar în ordine alfabetică (a,e,i,o,u) şi nicio vocală nu se repetă.
Exemplu: Pentrul textul vaporul pluteşte pe mare se va afişa vaporul pe mare.(10p.)
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char s[256],*p;
cin.get(s,256); p=strtok(s," ");
while(p)
{ int vb=1;
int k=strlen(p); putem prelua vocalele in alt cuvant ..sorta..si verifica
sau putem face direct
for(int i=0;i<k-1 && vb;i++)
for(int j=i+1;j<k &&vb;j++)
if(strchr("aeiou",p[i]) &&
strchr("aeiou",p[j])
&& p[i]>=p[j]) vb=0;
if(vb)
cout<<p<<" "; p=strtok(NULL," ");
}
return 0;
}
using namespace std;
int main()
{int i,j;
char s[100]="azi e ceva azi e azi";
i=0;
while(i<strlen(s))
{j=i+1;
while(s[j]!=' ' && s[j]!=NULL) j++;
if(j-i==3) {s[i]='*';
strcpy(s+i+1,s+i+3);
i=i+2;
}
else i=j+1;
}
cout<<s;
return 0;
}
dar utilă pentru a învăţa să lucrăm pe stringuri
ar fi să căutăm al 2 lea şir în primul şi să
"tăiem" din spatele şirului o literă până găsim
un subşir.......
sau să luăm prima literă a primului cuvânt
să-l adăugăm la sfârşit ......
#include <cstring>
#include<fstream>
problema campion
using namespace std;
ifstream f("circular.in");
ofstream g("circular.out");
char si[20001],sf[20001],*p;
int n;
int main()
{ char sc[20001],st[20001];
f>>n;
f.get();
f.getline(si,20000);
f.getline(sf,20000);
strcpy(sc,sf);
int c=n-1;
int ok=1;
prima litera tb sa existe in textul initial
if(strchr(si,sf[0])==0) g<<-1;
else
{ while(ok)
{
p=strstr(si,sc);
if(p){ok=0;}
else
{ strcpy(sc+c,sc+c+1);
sterg ultima litera
--c;
}
}
++c; valoare corecta c
int poz=p-si;pozitia celui mai lung subsir
impart sirul
strcpy(st,sf+c);
strcpy(si+poz,si+poz+c);
sterg din sirul initial subsirul gasit
if (strcmp(si,st)==0) g<<poz;
else g<<-1;
}
return 0;
}
să concatenăm primul şir cu el însuşi
şi să căutăm al doilea şir în şirul concatenat
using namespace std;
ifstream f("circular.in");
ofstream g("circular.out");
char si[40001],sf[20001],*p;
int n;
int main()
{ char sc[20001],st[20001];
f>>n;
f.get();
f.getline(si,20000);
f.getline(sf,20000);
strcat(si,si);
p=strstr(si,sf);
if(p) g<<p-si;
else g<<-1;
STRTOK
Sintaxa: strtok(s1_unde_caut, s2_ce_separatori_caut)
Functia inlocuieste separatorii din s1 cu NULL si returneaza un pointer catre primul character al primei unităţi lexicale(Ex.cuvant)..pentru a gasi urmatoarea secventa se apeleaza strtok(NULL, s2)
P3. Separarea cuvintelor din text cu strtok()
#include <cstring>
#include <iostream>
using namespace std;
int main()
{ char s[100]="Popescu Vasile",*c1,*c2;
c1=strtok(s," ");
cout<<c1<<endl;
c2=strtok(NULL," ");
cout<<c2<<endl;
strcat(c2," ");
strcat(c2,c1);
cout<<c2;
return 0;
}
Ex1. Sa se afiseze cuvintele dintr-un text
#include <iostream>
#include <cstring>
exemple ptr.utilizarea
fctiei strtok
using namespace std;
char sir[]="anul acesta, va fi un bacalaureat foarte usor si vom lua toti nota 10";
char *p;
pointer catre char
declaram separatorii intre cuvinte virgula si spatiu de exemplu
char sep[]=", ";
int main()
{ p=strtok(sir,sep);
while (p)
{cout<<p<<endl;
p=strtok(NULL,sep);
}
return 0;
}
Ex.2 . prelucrare cuvinte din text
Se consideră un text cu maximum 250 de caractere, format din litere mici ale alfabetului englez şi spaţii. Cuvintele sunt separate printr-un singur spaţiu. Scrieţi programul Pascal/C/C++ care citeşte un text ca cel menţionat şi afişează pe ecran acele cuvinte în care vocalele apar în ordine alfabetică (a,e,i,o,u) şi nicio vocală nu se repetă.
Exemplu: Pentrul textul vaporul pluteşte pe mare se va afişa vaporul pe mare.(10p.)
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char s[256],*p;
cin.get(s,256);
p=strtok(s," ");
while(p)
{ int vb=1;
int k=strlen(p);
putem prelua vocalele in alt cuvant ..sorta..si verifica
sau putem face direct
for(int i=0;i<k-1 && vb;i++)
for(int j=i+1;j<k &&vb;j++)
if(strchr("aeiou",p[i]) &&
strchr("aeiou",p[j])
&& p[i]>=p[j]) vb=0;
if(vb)
cout<<p<<" ";
p=strtok(NULL," ");
}
return 0;
}